/*
 * @lc app=leetcode.cn id=65 lang=java
 *
 * [65] 有效数字
 *
 * https://leetcode.cn/problems/valid-number/description/
 *
 * algorithms
 * Hard (27.59%)
 * Likes:    348
 * Dislikes: 0
 * Total Accepted:    64.1K
 * Total Submissions: 232.4K
 * Testcase Example:  '"0"'
 *
 * 有效数字（按顺序）可以分成以下几个部分：
 * 
 * 
 * 一个 小数 或者 整数
 * （可选）一个 'e' 或 'E' ，后面跟着一个 整数
 * 
 * 
 * 小数（按顺序）可以分成以下几个部分：
 * 
 * 
 * （可选）一个符号字符（'+' 或 '-'）
 * 下述格式之一：
 * 
 * 至少一位数字，后面跟着一个点 '.'
 * 至少一位数字，后面跟着一个点 '.' ，后面再跟着至少一位数字
 * 一个点 '.' ，后面跟着至少一位数字
 * 
 * 
 * 
 * 
 * 整数（按顺序）可以分成以下几个部分：
 * 
 * 
 * （可选）一个符号字符（'+' 或 '-'）
 * 至少一位数字
 * 
 * 
 * 部分有效数字列举如下：["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3",
 * "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
 * 
 * 部分无效数字列举如下：["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]
 * 
 * 给你一个字符串 s ，如果 s 是一个 有效数字 ，请返回 true 。
 * 
 * 
 * 
 * 示例 1：
 * 
 * 
 * 输入：s = "0"
 * 输出：true
 * 
 * 
 * 示例 2：
 * 
 * 
 * 输入：s = "e"
 * 输出：false
 * 
 * 
 * 示例 3：
 * 
 * 
 * 输入：s = "."
 * 输出：false
 * 
 * 
 * 
 * 
 * 提示：
 * 
 * 
 * 1 <= s.length <= 20
 * s 仅含英文字母（大写和小写），数字（0-9），加号 '+' ，减号 '-' ，或者点 '.' 。
 * 
 * 
 */

// @lc code=start
class Solution {
    public boolean isNumber(String s) {
        return isNumber_konggeqian(s.toCharArray(), 0);

    }

    boolean isNumber_konggeqian(char[] data, int index){
        if (data[index]==' ') {
            index++;
        }
        if (data.length==index) {
            return false;
        }
        return isNumber_fuhao(data, index)||isNumber_xiaoshudot(data, index);
    }
    boolean isNumber_fuhao(char[] data, int index){
        if (data[index]=='-'||data[index]=='+') {
            index++;
        }
        if (data.length==index) {
            return false;
        }
        return isNumber_zhengshu(data, index);
        
    }
    boolean isNumber_zhengshu(char[] data, int index){
        if (data[index]<='9'&&data[index]>='0') {
            index++;
        }else{
            return false;
        }
        while (index<data.length&&data[index]<='9'&&data[index]>='0') {
            index++;
        }
        //状态1：.
        //状态2：E
        if (data.length==index) {
            return true;
        }
        return isNumber_xiaoshudot(data, index)|| isNumber_E(data, index);
    }
    boolean isNumber_xiaoshudot(char[] data, int index){
        if (data[index]!='.') {
            return false;//进入失败
        }
        index++;
        if (data.length==index) {
            return false;
        }
        return isNumber_xiaoshu(data,index);
    }
    boolean isNumber_xiaoshu(char[] data, int index){
        if (data[index]<='9'&&data[index]>='0') {
            index++;
        }else{
            return false;
        }
        while (data.length>index&&data[index]<='9'&&data[index]>='0') {
            index++;
        }
        if (data.length==index) {
            return true;
        }
        return isNumber_E(data, index);
    }
    boolean isNumber_E(char[] data, int index){
        if (data[index]=='E'||data[index]=='e') {
            index++;
            if (data.length==index) {
                return false;
            }
            return isNumber_kexuejishufuhao(data,index);
        }
        else{
            return isNumber_konggehou(data, index);
        }

    }
    boolean isNumber_kexuejishufuhao(char[] data, int index){
        if (data[index]=='-'||data[index]=='+') {
            index++;
        }
        if (data.length==index) {
            return false;
        }
        return isNumber_kexuejishunum(data, index);
    }

    boolean isNumber_kexuejishunum(char[] data, int index){
        if (data[index]<='9'&&data[index]>='0') {
            index++;
        }else{
            return false;
        }
        while (data.length>index&& data[index]<='9'&&data[index]>='0') {
            index++;
        }
        return isNumber_konggehou(data, index);
    }
    boolean isNumber_konggehou(char[] data, int index){
        while (data.length>index&& data[index]==' ') {
            index++;
        }
        return index==data.length;
    }
}
// @lc code=end

